package com.itany.task.task;

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@EnableAsync
@EnableScheduling//开启定时任务
public class TestTask {

    /*
        cron表达式
        它是由若干数字 空格 特殊字符按照一定规律组合的字符串
        用于表示系统中的时间信息
        格式
        字符串以空格分隔
        分隔为6-7个域
        每个域代表一个时间含义
        秒 分 时 日 月 星期 年（可选）
        秒 0-59
        分 0-59
        时 0-23
        日 1-31
        月 1-12 JAN-DEC
        星期 1-7 SUN-SAT
        年 1970-2099

        特殊字符
        * 表示匹配任意值
        ? 表示匹配任意值，值用在星期和月两个域
        - 表示范围
        / 表示起始按周期触发
        , 表示枚举
        L 表示最后
        W 表示有效工作日
        LW 表示最后一个工作日
        # 表示第几个月的星期几

        在每月1号三点执行               0 0 3 1 * ？
        周一到周五下午13:30执行         0 30 13 ? * 2-6
        每天10点、13点、14点执行        0 0 10,13,14 * * ?
        2024年每天10:15执行            0 15 10 * * ? 2024
        每天14点到14:59每分钟触发一次    0 * 14 * * ?
        每天14点到14:59每5分钟触发一次   0 0/5 14 * * ?
        每个月最后一个工作日15点执行      0 0 15 LW * ?
        每个月最后一个星期五10点执行      0 0 10 ? * 6L
        每个月5号工作日10点执行          0 0 10 5W * ?
        每个月第三个星期五10点执行       0 0 10 ? * 6#3
    */
    @Async("myExecutor")
//    @Scheduled(cron = "30 13 11 * * ?")
//    @Scheduled(cron = "${cron.expression}")
//    @Scheduled(cron = "#{cronBean.expression}")
    @Scheduled(cron = "#{cronBean.findExpression()}")
    public void f(){
        System.out.println("TestTask.f() "+Thread.currentThread().getName()+" "+new Date());
    }
}
